/**
灵蛇，以最快速度加载到指定资源数组
当有任务的时候就把这个Froze()掉,然后临时任务完毕再JumpTo():从指定索引加载
 * 注意这个会发出progress的event
*/

package kgame5.kio.ksnake {
import kgame5.kutil.*;

import flash.display.*;
import flash.events.*;
import flash.system.ApplicationDomain;

public class AgiSnake extends EventDispatcher{
	public static const 
		EVENTTYPE_A_NODE_OK:String="EVENTTYPE_A_NODE_OK";
		
	//___________________Property________________________
	private var aNode:Array;
	private var len:int;
	public var _aimAppDomain:ApplicationDomain;
	//_____________________Method_______________________
	public function AgiSnake(aimAppDomain:ApplicationDomain=null){
		len=0;
		if(aimAppDomain==null){
			_aimAppDomain=new ApplicationDomain();
		}else{
			_aimAppDomain=aimAppDomain;
		}
	}
	public function Create(aUrl:Array){
		//T.p("Snake.Create",aUrl.length);
		len=aUrl.length;
		aNode=new Array();
		for(var i:int=0;i<len;i++){
			var node:SnakeNode=new SnakeNode(this,aUrl[i],i);
			aNode.push(node);
		}
	}
	
	//释放所有资源
	public function Release(){
		Froze();
		aNode=null;
		len=0;//这个一定要放在froze()的后面，froze用到了len
	}
	//跳到指定位置开始加载，以前的不管,返回一个Loader是被外部可以用来注册lsnter用的,每次node.Start()都生成新的loader,不必担心事件覆盖
	public function JumpTo(idx:int):Loader{
		//T.p("JumpTo",idx);
		if(idx<0){
			idx=0;
		}else if(idx>len-1){
			idx=len-1;
		}
		Froze();
		var node:SnakeNode=getNodeAt(idx);
		node.Start();
		
		return node.loader;
		//tempNode=node;
	}
	
	
	//冻结所有加载的，为了给要加载的全部网络资源
	public function Froze(){
		//T.p("冻结所有");
		for(var i:int=0;i<len;i++){
			var node:SnakeNode=aNode[i];
			node.Stop();
		}
	}
	
	//*
	public function getNodeAt(idx:int):SnakeNode{
		return aNode[idx];
	}
	public function FindNode(sUrl:String):SnakeNode{
		
		for(var i:int=0;i<len;i++){
			var node:SnakeNode=aNode[i];
			if(node.sUrl==sUrl){
				return node;
			}
		}
		return null;
	}
	//*/
	//是否全部都加载完了
	public function isAllFinished():Boolean{
		//var bAllFinished:Boolean=false;
		for(var i:int=0;i<len;i++){
			var node:SnakeNode=aNode[i];
			if(node.bFinished==false){//有一个没加载完就是没加载完
				return false;
			}
		}
		
		return true;
	}
	
	 override public function toString():String{
		var s:String=("AgiSnake\n");
		for(var i:int=0;i<len;i++){
			
			var node:SnakeNode=aNode[i];
			
			//trace("idx:"+node.idx+": isFindeshed:"+node.bFinished+" isOK:"+node.bOK+"\n");
			s+=node.toString()+"\n";
		}
		return s;
	}
	
	//被通知说有一个加载到了
	public function onNode_LoadFinished(node:SnakeNode){
		//T.p("---------------onNode_LoadFinished----------------" + node.idx);
		//--向外发送事件说有一个加载成功了
		if(node.bOK){
			//发送事件说有一个图片加载成功
			this.dispatchEvent(new KEvent(EVENTTYPE_A_NODE_OK,{content:node.loader.content,idx:node.idx}));
		}else{//没处理失败的情况
		}
		
		//--
		var curIdx:int=node.idx;
		curIdx++;
		
		if(isAllFinished()==false){//没加载完
			curIdx%=len;//这个如果到了头就要滚回来
			JumpTo(curIdx);
		}else{//全部加载完毕
			//T.p("全部加载完毕");
		}
		
	}
}//end of class
}
